自分のAWS環境をScout2を使ってセキュリティ監査を行ってみる
今回は、自分のAWS環境に対してセキュリティチェックを行うことができるScout2というツールを紹介したいと思います。
Scout2とは
先ほども書きましたが、Scout2はAWS環境に対するセキュリティ監査ツールです。
例えば、不要なポートがSecurityGroupでAnywhereでアクセスできる状態になっていないか、IAMユーザにMFAが導入されているか、といったことをチェックすることができます。
主な特徴
Scout2は、まだ開発途上にあるツールですが、以下のような特徴があります。
独自の監査ルール
独自に監査ルールを設定することができ、ルールセットはjson形式で作成します。
これにより自社に合ったルールでセキュリティチェックが可能です。
HTMLレポート
チェック結果をHTMLファイルに出力できます。
チェック結果の他に、AWSの各種設定も出力してくれます。
対応サービス
対応しているAWSサービスは以下の通りです。
今後のリリースで対応サービスが増えるかもしれません。
- CloudTrail
- EC2
- IAM
- RDS
- Redshift
- S3
Trusted Advisorとの違い
AWSネイティブのサービスとしてTrusted Advisorがありますが、Scout2は似たような機能を提供します。
大きな違いとしては、独自のチェックルールを作成できるという点かと思います。
Trusted Advisorは、チェックルールを自由にカスタマイズすることはできないので、自社のルールに合わせてチェックしたいという場合は、一考の余地がありそうです。
試してみる
早速インストールして試したいと思います。
インストール
今回は、AmazonLinuxに導入してみます。
ユーザはデフォルトのec2-userです。
$ git clone https://github.com/iSECPartners/Scout2.git $ cd Scout2/ $ sudo pip install -r requirements.txt
チェックの実行
Scout2を実行する場合、監査対象に対して参照のIAM権限が必要です。
今回は、Scout2を実行するEC2に対してReadOnlyのIAM Roleを指定したので、下記のコマンドを実行します。
$ python Scout2.py
IAM roleが無くても、参照権限のあるIAMユーザでも実行可能です。
その場合は、下記のようにcredentialファイルを指定したオプションを利用します。
ファイルは、IAM作成時のCSVフォーマットのままで読み込めます。
$ python Scout2.py --csv-credentials <CREDENTIALS.CSV>
また、MFA認証のユーザで実行するときは下記のオプションが用意されています。
--mfa-serial <ARN_MFA_SERIAL_NUMBER> --mfa-code <MFA CODE>
HTMLレポートを見てみる
Scout2.pyを実行すると、report.html
というファイルが作成されるので、ディレクトリの中身丸ごとWebサーバのドキュメントルートに移します。
2回目からはreport.html
を上書きするだけで大丈夫です。
それでは実際の画面を見ていきます。
試しにMFAを導入していないIAMユーザを作った状態でチェックすると、下記のように「IAM」のページで「MFAなしのユーザが存在する」という赤色の警告が表示されます。
なお、緑色は問題なし、黄色は注意という意味合いになります。
Trusted Advisorとおおよそ同じ意味ですね。
ここで表示タイトルの「User without MFA」をクリックすると詳細画面を表示できます。
画像の通り「testtest」というユーザに対してMFAの設定が「No」になっているという説明が書かれています。
ルールの追加
デフォルトだけでも色々とチェックできて便利ですが、自社サービス用のポートなどを利用している場合、その独自ポートの開放状況もチェックしたい、といった場合があるかもしれません。
そこで、例として「19999番のポートがAnywhere公開されていたらdanger」と判定する監査項目を追加してみます。
項目名は「myapp port open」とします。
追加方法
オリジナルなルールを追加する際は、ルールを定義したjsonファイルを作成し、対応した処理をpythonの関数で定義します。
そして、HTMLレポートの雛形を修正します。
今回は、すでに雛形があるので、それを元に新ルールを追加してみます。
雛形があるので、以下の定義ファイルに新しいルールを追加するだけです。
- Scout2/rulesets/default.json
"args": ["Telnet", "TCP", "23"] }, { + "filename": "ec2-security-group-opens-plaintext-port.json", + "enabled": "true", + "args": ["myapp", "TCP", "19999"] + }, + { "filename": "ec2-security-group-opens-port-range.json", "enabled": "true" },
- Scout2/rulesets/full.json
"args": ["Telnet", "TCP", "23"] }, { + "filename": "ec2-security-group-opens-plaintext-port.json", + "enabled": "true", + "args": ["myapp", "TCP", "19999"] + }, + { "filename": "ec2-security-group-opens-port-range.json", "enabled": "true" },
ルールが追加できたら再度Scout2を実行します。
新たに出力されたHTMLファイルを更新すると以下のように、EC2の監査画面のダッシュボードにmyappの項目が出力されています。
今回は予め条件にマッチするようにSecurityGroupを設定しておいたので、チェックに引っかかって赤色になっています。
詳細を開くと、SecurityGroupで19999ポートがAnywhereアクセスになっていることが分かります。
最後に
いかがでしたでしょうか。
多くの場合は、Trusted Advisorで十分かと思いますが、独自のルールを追加してチェックしたいという場合など、要件に応じてうまく使い分けてもらえればと思います。
参考情報
- Trusted Advisor - AWS サポート | AWS
- AWS Blackbelt 2015シリーズ AWS Support / Trusted Advisor
- 料金 - AWS サポート | AWS
- AWS再入門 AWS Trusted Advisor編 | Developers.IO
- AWS Trusted Advisorでサービスの制限を確認する | Developers.IO
- AWS-CLIでTrusted Advisorのステータスを見たい | Developers.IO
以上になります。